package cn.biplam.front.component.data.tree;

import java.util.ArrayList;

import cn.biplam.common.tools.TOOLS;
import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.common.wrapper.KvMap;
import cn.biplam.common.wrapper.tree.LinkListNode;
import cn.biplam.common.wrapper.tree.TreeNode;
import cn.biplam.common.wrapper.tree.TreeStructre;

/**
 * 	自定义数据作为数据源的树形控件数据操作组件，插入数据父节点在子节点之前
 * @author XiaoRuxing 2009-6-8下午03:30:17
 * @version 1.0
 */
public class TreeCustomData extends TreeData{

	/** 树节点容器 */
	private ArrayList<TreeNode> nodes;
	private TreeNode head;
	/** 树数据容器 */
	private TreeStructre treeData;
	/** 当前节点向下取几级数据 */
	private String levelDown;
	/** 当前查询父节点ID */
	private String nodeId;
	private boolean virtualNodeVisiable=false;

	/**
	 * 创建自定义数据源的数据控件数据操作组件
	 * @param nodeId    当前节点id
	 * @param levelDown 当前节点向下取几级数据  -1 全部 0 当前  1 当前节点下1级 2当前节点向下2级 ... n当前节点向下n级
	 */
	public TreeCustomData(String nodeId,String levelDown){
		nodes=new ArrayList<TreeNode>();
		this.nodeId=nodeId;
		this.levelDown=levelDown;
	}

	/**
	 * 插入根节点
	 * @param node 根节点
	 */
	public void putHead(TreeNode node){
		this.head=node;
	}

	/**
	 * 插入单个节点到树节点容器
	 * @param node 自定义数据内容
	 */
	public void putData(TreeNode node){
		nodes.add(node);
	}

	/**
	 * 批量插入节点到树节点容器
	 * @param al 
	 */
	public void putData(ArrayList<TreeNode> al){
		this.nodes.addAll(al);
	}
	
	/**
	 *  放入链表数据
	 * @param list 链表数据
	 */
	public void setData(LinkListNode<TreeNode> list){
		this.treeData = new TreeStructre(list);
	}

	/**
	 * 插入自定义节点数据到树节点容器
	 * @param nodeId     节点ID
	 * @param nodeParent 节点父亲ID
	 * @param nodeName   节点名称
	 */
	public void putData(String nodeId,String nodeParent,String nodeName){
		TreeNode node=new TreeNode(nodeId,nodeParent,nodeName);
		nodes.add(node);
	}

	
	/**
	 *  设置虚根节点是否显示
	 * @param virtualNodeVisialble
	 */
	public void setVirtualNodeVisiable(boolean virtualNodeVisialble){
		this.virtualNodeVisiable = virtualNodeVisialble;
	}

	/**
	 * 创建树数据
	 * @throws ErrorMessage 
	 */
	public void create() throws ErrorMessage {
		_generatorTreeStruct();
		switch (TOOLS.stringToInt(this.levelDown)) {
		case 0:
			this.rs=this.treeData.getNode(this.nodeId);
			break;
		default:
			this.rs=this.treeData.getChildren(this.nodeId, this.levelDown);
		break;
		}
		_setVirtualNode();
	}

	/**
	 * 取得需展开节点的所有父亲id
	 * @param extendNodeId 需要展开的节点Id
	 * @param level        需要展开的节点在树中的级别
	 * @return KvMap<父节点id,父节点id>
	 * @throws ErrorMessage 
	 */
	@Override
	public KvMap<String, String> getExtendNodeAllParent(String extendNodeId) throws ErrorMessage {
		KvMap<String, String> kvParents = new KvMap<String, String>();
		String [] data=treeData.getParents(extendNodeId);
		String parentID=null;
		for(int i=0;i<data.length;i++){
			parentID=data[i];
			kvParents.put(parentID, parentID);
		}
		return kvParents;
	}
	
	/**
	 * 生成树数据结构  
	 */
	private void _generatorTreeStruct() throws ErrorMessage{
		//如果外部传入数据不创建
		if(treeData==null){
			treeData=new TreeStructre();
			if(this.head==null){
				throw new ErrorMessage("The root node not exist");
			}
			treeData.insertHead(this.head);
		}
		for(TreeNode node:nodes){
			treeData.insert(node);
		}
	}
	
	/**
	 *  设置虚根节点数据
	 * @throws ErrorMessage
	 */
	private void _setVirtualNode() throws ErrorMessage{
		if(this.head==null)return;
		if(this.virtualNodeVisiable){
			if(!TOOLS.StringIsEmpty(this.head.getNodeName())){//根节点名称为空
				this.setVirtualRootNode(this.head.getNodeName(), vNodePic); //设置须根名称为根名称
			}
		}
	}

}
